home *** CD-ROM | disk | FTP | other *** search
- ## mffsol.icn -- show solution graphically in mff format
- #
- # input is assumed to be one line per round
- # each player is represented by a different ASCII character
- # matches are broken by whitespace
-
- global range # vertical coordinate range
- global red, green, blue # current color
-
- procedure main (args)
- range := 1000
- aset := cset(&ascii ? (tab(upto(' ')) & move(1) & move(94)))
- pset := '' # set of chars in use as players
- plist := "" # same, in order of appearance
- rounds := [] # list of rounds (one text line each)
- nmatches := 0
-
- if *args > 0 then
- f := open(args[1]) | stop("can't open ",args[1])
- else
- f := &input
-
- # read input and save in memory
- # (this first pass just accumulates a list of players)
- while line := read(f) do
- if line[1] ~== "[" & upto(aset,line) then {
- put(rounds,line)
- line ? while tab(upto(aset)) do {
- c := move(1)
- if not any(pset,c) then { # if first appearance of new player
- pset ++:= c # add to set of players
- plist ||:= c # add at end of list
- }
- }
- }
-
- # if all the characters are letters, arrange alphabetically
- if *(plist -- &ucase -- &lcase) = 0 then
- plist := string(cset(plist))
-
- # calculate a position (angle) for each player, and draw the clock face
- write("1 metafile ", pct(125), " ", pct(100), " 0 0 0 init")
- angle := table()
- dtheta := 2 * 3.14159 / *pset
- theta := 3.14159 / 2 - dtheta / 2
- every c := !plist do {
- angle[c] := theta
- cart(47, theta, -1, -1)
- write("(",c,") text")
- theta -:= dtheta
- }
-
- # draw each round in a different color
- n := 1
- red := 250
- green := 255
- blue := 0
- every r := !rounds do {
- write(red, " ", green, " ", blue, " color")
- x := pct(110)
- y := pct(100 - 4 * n)
- if y > 0 then
- write(x, " ", y, " (", n, ") text")
- r ? while tab(upto(aset)) do {
- match := tab(many(aset))
- cart (45, angle[match[1]], 0, 0); writes ("begin ")
- cart (45, angle[match[2]], 0, 0); writes ("line ")
- cart (45, angle[match[3]], 0, 0); writes ("line ")
- cart (45, angle[match[4]], 0, 0); writes ("line ")
- cart (45, angle[match[1]], 0, 0); write ("line")
- cart (45, angle[match[3]], 0, 0); writes ("line stroke ")
- cart (45, angle[match[2]], 0, 0); writes ("begin ")
- cart (45, angle[match[4]], 0, 0); write ("line stroke")
- nmatches +:= 1
- }
- n +:= 1
- newcolor()
- }
-
- # write some final statistics
- write ("255 255 255 color")
- write ("0 0 (",
- *pset," players, ",*rounds," rounds, ",nmatches," matches) text")
- end
-
-
- # given polar coordinates (radius,angle,dx,dy), write cartesian equivalents
- # offset by (dx,dy)
-
- procedure cart (r,a,dx,dy)
- x := pct (50 + r * cos(a) + dy)
- y := pct (50 + r * sin(a) + dy)
- writes (x," ",y," ")
- end
-
-
- # return a string representing a given percentage of the coordinate range
-
- procedure pct (n)
- return string(integer(n * range / 100))
- end
-
-
- # set new color coordinates. iterate until acceptable.
-
- procedure newcolor()
- repeat {
- red := (red + 103) % 256
- green := (green + 211) % 256
- blue := (blue + 71) % 256
- lum := 0.30 * red + 0.59 * green + 0.11 * blue
- if lum > 96 then return
- }
- end
-